import 'dart:convert';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:ycbl/model/bl_error_entity.dart';
import 'package:ycbl/utils/log_util.dart';
import 'package:ycbl/widget/provider/base_view_state_model.dart';

/// 列表类型的数据加载状态
abstract class BaseViewStateListModel<T> extends BaseViewStateModel{

  /// 列表数据
  List<T> list = [];

  /// 分页数据量： 默认 20
  int pageSize = 20;
  /// 上次分页索引位置，即每页从第 index 条数据开始查询
  int lastIndex = 0;
  /// 临时索引 防止加载失败后 分页索引错误
  int tmpIndex = 0;

  /// 控制下拉刷新、加载更多
  RefreshController refreshController = RefreshController(initialRefresh: false);

  /// 第一次加载页面数据
  initData() {
    //初次加载数据 设置状态为加载中
    setBusy();
    refresh(isInit: true);
  }

  /// 下拉刷新  isInit: 表示是否为第一次加载数据，
  /// 如果是的话，则在加载数据失败后，显示失败 View，
  /// 如果不是初次加载，则显示原列表数据
  refresh({bool isInit = false}){
    tmpIndex = 0;
    internalLoadData(startIndex: tmpIndex, onListSuccess: (listData){

      //加载完成后，可能需要做的一些事情
      onLoadComplete(listData);

      //成功后，赋值新索引
      lastIndex = tmpIndex;

      //停止刷新，并重置加载更多的状态，防止刷新后，加载更多状态不变的问题
      refreshController.refreshCompleted(resetFooterState: true);

      //没有数据，显示空页面
      if(listData.isEmpty) {
        setEmpty();
        return;
      }

      list.clear();
      list.addAll(listData);

      //没有更多数据了，禁止加载更多
      if(listData.length < pageSize) {
        refreshController.loadNoData();
      }

      //显示加载完成的 View
      setIdle();

    },onListError: (error){
      //停止刷新
      refreshController.refreshFailed();
      // 如果是初次加载失败，则显示失败 View，否则显示原列表数据
      if(isInit) {
        setError(error);
      }
    });
  }

  /// 加载更多
  loadMore(){
    //临时索引
    tmpIndex = lastIndex + pageSize;
    LogUtil.e("每次请求的下标 tmpIndex");
    LogUtil.e(tmpIndex);
    internalLoadData(startIndex: tmpIndex, onListSuccess: (listData){

      //加载完成后，可能需要做的一些事情
      onLoadComplete(listData);

      //成功后，赋值新索引
      lastIndex = tmpIndex;

      list.addAll(listData);

      if(listData.length < pageSize) {
        //没有更多数据，禁止加载更多
        refreshController.loadNoData();
      }else {
        //加载完成
        refreshController.loadComplete();
      }

      //更新页面
      notifyListeners();

    },onListError: (error){
      //加载更多失败
      refreshController.loadFailed();

    });
  }

  /// 加载数据  内部调用
  internalLoadData({int startIndex, Function(List<T> list) onListSuccess, Function(BLErrorEntity error) onListError});

  /// 加载成功后，可能需要做一些操作，就 override 这个方法
  onLoadComplete(List<T> newListData) {}

}